#[derive(Debug)]
struct Student {
    name : String,
    addr : String,
    sex : bool,
    age : u32,
}

struct Teacher (String, i32, bool);

fn main() {
    {
        // 对于 Student 这类类型，默认是移动语义（所有权转移）
        let tmpsdt = Student {
            name : String::from("lxin"),
            addr : String::from("jinzhou"),
            sex : false,
            age : 33,
        };
        get_student_info(&tmpsdt);
        // tmpsdt与insdt地址不同，但insdt与&tmpsdt.name地址一致。
        // 推测：tmpsdt是一个指针，insdt是指向的内容。
        println!("student info:{:p},{},{},{},{}", &tmpsdt, tmpsdt.name, tmpsdt.addr, tmpsdt.sex, tmpsdt.age);
        println!("student size:{}", std::mem::size_of_val(&tmpsdt));
        println!("student info:{:p}", &tmpsdt.name);
        println!("student ->:{:p}", tmpsdt.name.as_ptr());
        // error[E0277]: `tmpsdt` doesn't implement `std::fmt::Display`
        // 所以结构体并没有提供一个 Display 实现。
        // #[derive(Debug)]
        // Debug 是一个 trait，它允许我们以一种对开发者有帮助的方式打印结构体，以便当我们调试代码时能看到它的值。
        println!("student info:{:?}", tmpsdt);
    }
    {
        let tmptcr = Teacher (String::from("cteacher"), 56, true);
        println!("student info:{},{},{}", tmptcr.0, tmptcr.1, tmptcr.2);
    }
}

fn get_student_info(insdt : &Student) {
    println!("student info:{:p},{},{},{},{}", &insdt, insdt.name, insdt.addr, insdt.sex, insdt.age, );
    println!("student info:{:p}", &insdt.name);
}

// fn type_str<T>(_val: T) -> & 'static str {
//     std::any::type_name::<T>()
// }